package com.xiaoyu.doublePointer;

/**
 * @program: DS_and_A
 * @description:
 * 给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。
 * 说明：本题中，我们将空字符串定义为有效的回文串。
 * //去掉除字母和数字之外的所有字符之后,该字符串是一个回文串
 * 输入: "A man, a plan, a canal: Panama"
 * 输出: true
 *
 * @author: YuWenYi
 * @create: 2021-05-04 16:33
 **/
public class IsPalindrome {
    public static boolean isPalindrome(String s) {
    /*    //左指针记录左边的位置
        int left = 0;
        int right = s.length()-1; //右指针
        //如果左指针大于等于了右指针,那么就结束循环
        while (left < right){
            //必须要是左右都是字母或者数字才去进行忽略大小写的比较
           if (Character.isLetterOrDigit(s.charAt(left)) && Character.isLetterOrDigit(s.charAt(right))) {
               //比较成功的话,两个指针向中间靠拢一位
               if (Character.toLowerCase(s.charAt(left)) == Character.toLowerCase(s.charAt(right))) {
                   left++;
                   right--;
               } else {
                   return false;  //一但有没有比较成功的情况,就返回false
               }
           }else if (!Character.isLetterOrDigit(s.charAt(left))){ //如果是左边为非数字或者字母,就跳过它
               left++;
           }else if (!Character.isLetterOrDigit(s.charAt(right))){ //如果是右边为非数字或者字母,就跳过它
               right--;
           }else {  //都不是的话,就出错了
               return false;
           }
        }
        return true;  //如果能顺利到这里来,说明确实是回文字符串*/

        //方法二:使用StringBuffer的字符串反转来判断是否回文串
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (Character.isLetterOrDigit(ch)) {
                sb.append(Character.toLowerCase(ch));
            }
        }
        StringBuffer sb_rev = new StringBuffer(sb).reverse();
        return sb.toString().equals(sb_rev.toString());
    }

    public static void main(String[] args) {
        String s = "1233121";
        boolean palindrome = isPalindrome(s);
        System.out.println("is----->" + palindrome);
    }
}
